import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'
// import { ElMessage, ElMessageBox } from 'element-plus'
// import { store } from '@/store'
// import { routerTo } from '@/utils/router'

const api = axios.create({
  baseURL: '/api',
  timeout: 30000, // 请求 30s 超时
  // headers: {
  //   get: {
  //     'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
  //   },
  //   post: {
  //     'Content-Type': 'application/json;charset=utf-8'
  //   }
  // }
})

// 请求拦截器
api.interceptors.request.use(
  (config: AxiosRequestConfig) =>
    // 统一设置用户身份 token
    // const { headers: { Authorization } } = config
    // const user = store.state.user
    // if (user && user.token) {
    //   config.headers.Authorization = `Bearer ${user.token}`
    // }
    config,
  (error: any) =>
    // Do something with request error
    Promise.reject(error)
)

// 控制登录过期的锁
let isRefreshing = false

// 响应拦截器
api.interceptors.response.use(
  (response: AxiosResponse<any>) => {
    const { data, status } = response
    // 正确的情况
    if (status === 200) {
      if (data.code === 200) {
        return response
      }
      return Promise.reject(data)
    }

    // 错误情况：比如 token 无效...

    // 统一处理登录过期
    if (status === 410) {
      if (isRefreshing) return Promise.reject(response)
      isRefreshing = true
      // ElMessageBox.confirm('您的登录已过期，您可以取消停留在此页面，或确认重新登录', '登录过期', {
      //   confirmButtonText: '确认',
      //   cancelButtonText: '取消'
      // }).then(() => {
      //   // 清除本地过期的登录状态
      //   store.commit('setUser', null)
      //   // 跳转到登录页面
      //   routerTo({
      //     name: 'login',
      //     query: {
      //       redirect: router.currentRoute.value.fullPath
      //     }
      //   })
      //   // 抛出异常
      // }).finally(() => {
      //   isRefreshing = false
      // })

      // 在内部消化掉这个业务异常
      return Promise.reject(response)
    }

    // 其它错误情况
    // ElMessage.error(response.data.msg || '请求失败，请稍后重试')
    // 手动返回一个 Promise 异常
    return Promise.reject(response)
  },
  (error: { message: any }) =>
    // ElMessage.error(error.message || '请求失败，请稍后重试')
    Promise.reject(error)
)

export default {
  get<T = any>(config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'GET' })
  },
  post<T = any>(config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'POST' })
  },
  put<T = any>(config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'PUT' })
  },
  delete<T = any>(config: AxiosRequestConfig): Promise<T> {
    return this.request({ ...config, method: 'DELETE' })
  },
  request<T>(config: AxiosRequestConfig): Promise<T> {
    const { method, url, params } = config
    return api({
      method,
      url,
      data: method === 'POST' || method === 'PUT' ? params : null,
      params: method === 'GET' || method === 'DELETE' ? params : null,
      headers: {
        'Content-Type': 'application/json',
        Authorization: 'xxx',
      },
      // source对象保存取消方法
      // cancelToken: new axios.CancelToken(function executor (c) {
      // })
    }).then((res: any) => (res.data?.data || res.data) as T)
  },
}
